package com.cl.util;

import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

public class JdbcUtil {
	/**
	 * 获取连接
	 * 
	 * @return Connection
	 * @throws SQLException
	 * @throws ClassNotFoundException
	 */
	public static Connection getConn() throws SQLException,
			ClassNotFoundException {
		// 读取配置文件
		ResourceBundle rb = ResourceBundle.getBundle("jdbc");

		// 配置连接参数
		String url = rb.getString("url");
		String name = rb.getString("username");
		String psw = rb.getString("password");
		String driver = rb.getString("driverClassName");

		Class.forName(driver);

		// 返回连接
		return DriverManager.getConnection(url, name, psw);
	}

	/**
	 * 关闭JDBC对象
	 * 
	 * @param conn
	 * @param pst
	 * @param rst
	 */
	public static void closeJDBCObject(Connection conn, PreparedStatement ps,
			ResultSet rst) {
		try {
			if (rst != null)
				rst.close();
			if (ps != null)
				ps.close();
			if (conn != null)
				conn.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 数据库 增，删，改通用函数
	 * 
	 * @param sql
	 *            sql语句
	 * @param obj
	 *            参数数组
	 * @return 更新行数
	 */
	public static int execute(String sql, Object[] obj) {
		// 创建对象
		Connection conn = null;
		PreparedStatement ps = null;
		int row = 0;
		try {
			// 获得连接
			conn = getConn();
			// 准备查询
			ps = conn.prepareStatement(sql);
			// 配置参数
			if (obj != null) {
				for (int i = 0; i < obj.length; i++) {
					ps.setObject(i + 1, obj[i]);
				}
			}
			// 执行
			row = ps.executeUpdate();

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 关闭对象
			closeJDBCObject(conn, ps, null);
		}

		return row;
	}
	
	/**
	 * 查询所有字段通用
	 * 
	 * @param sql
	 *            sql语句
	 * @param object
	 *            参数数组
	 * @param clazz
	 *            bean.class
	 * @return List
	 */
	public static List getList(String sql, Object[] obj, Class clazz) {
		// 创建对象
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rst = null;

		// 创建集合接受数据
		List list = new ArrayList();

		try {
			// 获得连接
			conn = getConn();
			// 准备查询
			ps = conn.prepareStatement(sql);
			// 配置参数
			if (obj != null) {
				for (int i = 0; i < obj.length; i++) {
					ps.setObject(i + 1, obj[i]);
				}
			}
			// 执行
			rst = ps.executeQuery();
			// 获取元数据
			ResultSetMetaData rstmd = rst.getMetaData();
			int columnCount = rstmd.getColumnCount();
			String[] methodName = new String[columnCount];
			while (rst.next()) {
				Object objs = clazz.newInstance();
				for (int i = 1; i <= columnCount; i++) {
					// 方法名
					StringBuffer attribute = new StringBuffer();
					String[] arr = rstmd.getColumnName(i).split("_");
					for (int j = 0; j < arr.length; j++) {
						String tmp = Character.toString(arr[j].charAt(0)).toUpperCase()+arr[j].substring(1);
						attribute.append(tmp);
					}
					methodName[i - 1] = "set"+attribute.toString();
							
					String column = Character.toString(attribute.charAt(0)).toLowerCase()+attribute.substring(1).toString();
					// 属性类型
					Class<?> type = clazz.getDeclaredField(column).getType();
					String typeName = type.getSimpleName();
					// 反射得到方法
					Method method = clazz.getDeclaredMethod(methodName[i - 1],type);
					// 反射调用
					if (typeName.equals("Integer")) {
						method.invoke(objs, rst.getInt(i));
					} else if (typeName.equals("String")) {
						method.invoke(objs, rst.getString(i));
					} else if (typeName.equals("float")) {
						method.invoke(objs, rst.getFloat(i));
					}

				}
				// 将对象添加到集合
				list.add(objs);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 关闭对象
			closeJDBCObject(conn, ps, rst);
		}
		// 返回集合
		return list;
	}
}
